package com.mikey.single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author :Mikey
 * @description :懒汉式
 * @create :2022-09-27 14:29:00
 */
public class Lazy {
    private Lazy(){
        System.out.println(Thread.currentThread().getName());
    }
    private volatile static Lazy LAZY;
    //双重检测锁模式 懒汉式单利（DCL懒汉式）
    public static Lazy getInstance(){
        if (LAZY==null){
            synchronized (Lazy.class){
                if (LAZY==null){
                    LAZY=new Lazy();//不是一个原子性操作
                    /*
                    * 1.分配内存空间
                    * 2.执行构造方法
                    * 3.把对象指向这个空间
                    * 指令重排：132 假如两个线程：A执行了1,3，B线程不会认为LAZY为空，
                    * */
                }
            }
        }
        return LAZY;
    }
    //多线程并发有问题
//    public static void main(String[] args) {
//        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                Lazy.getInstance();
//            }).start();
//        }
//    }
    //反射
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Lazy lazy =Lazy.getInstance();
        Constructor<Lazy> de=Lazy.class.getConstructor(null);
        de.setAccessible(true);
        Lazy lazy1 = de.newInstance();
        System.out.println(lazy);
        System.out.println(lazy1);
    }
}
